package cn.com.bluemoon.daps.model.service;

import cn.com.bluemoon.daps.common.domain.ResultBean;
import cn.com.bluemoon.daps.common.enums.DatabaseType;
import cn.com.bluemoon.daps.common.exception.DapException;
import cn.com.bluemoon.daps.common.mp.IBmService;
import cn.com.bluemoon.daps.model.dto.DapDataModelTableDto;
import cn.com.bluemoon.daps.model.dto.TableListDto;
import cn.com.bluemoon.daps.model.dto.register.DapModelRegisterDto;
import cn.com.bluemoon.daps.model.entity.DapDataModelGroup;
import cn.com.bluemoon.daps.model.entity.DapDataModelTable;
import cn.com.bluemoon.daps.model.vo.DataModelTableInsertVO;
import cn.com.bluemoon.daps.model.vo.IdVo;
import cn.com.bluemoon.daps.model.vo.ModelIds;
import cn.com.bluemoon.daps.model.vo.group.in.GroupTableSearchVo;
import cn.com.bluemoon.daps.model.vo.register.SearchModelRegister;
import cn.com.bluemoon.daps.model.vo.share.SearchShareTableVo;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 数据模型-模型中设计表的表 服务类
 * </p>
 *
 * @author admin
 * @since 2020-08-03
 */
public interface DapDataModelTableService extends IBmService<DapDataModelTable> {

    /**
     * 查询复制列表
     * @param modelId
     * @return
     */
    List<DapDataModelTableDto> getCopyTableList(String modelId, Integer isNow);

    /**
     * 获取
     * @param modelId mId
     * @param
     * @return tableId-> FieldId vs FieldName
     */
    Map<String, Map<String, String>> findNewestTablesPage(String modelId);

    /**
     * 获取
     * @param modelId mId
     * @param pageBatchSize 1000
     * @return tableId-> FieldId vs FieldName
     */
    public Map<String, Map<String, String>> findNewestTablesPage(String modelId, int pageBatchSize);

    /**
     * 判断新增表名是否重复
     * @param tableName
     * @return
     */
    DapDataModelTable getModelTableByName(String tableName, String modelId);

    /**
     * 新增或更新模型表
     * @param vo
     * @return
     */
    ResultBean<String> insertModelTable(DataModelTableInsertVO vo);

    /**
     * 系统下所有模型，是否有重复表名
     */
    List<String> getRepeatTableName(List<String> tableNames, String modelId);

    /**
     * 获得表详情
     * @param modelTableId
     * @return
     */
    DapDataModelTable getModelTableById(String modelTableId);

    /**
     * 更新表操作时间
     * @param tableId
     */
    void saveTime(String tableId);
    /**
     * 删除备份表
     * @param modelId
     */
    void deleteTable(String modelId);

    /**
     * 根据表id删除表
     * @param id
     * @param dataType 数据库类型
     * @return
     */
    Boolean deleteTableAll(String id, DatabaseType dataType);

    /**
     * 复制表
     * @param vo
     * @return
     */
    ResultBean<?> copyTable(DataModelTableInsertVO vo);


   List<DapDataModelTableDto> getCopyTableInfo(String modelId);

    /**
     * v1.2版本 根据分组id获得表结构
     * @param ids
     * @return
     */
   List<TableListDto> getTableByGroupId(IdVo ids);


    /**
     * 分组和表的关系
     * 数仓类：模型id+第一层groupid+第二层
     * 非数仓类：模型id+第一层groupId
     *
     * @param
     * @param
     * @param modelId 模型id
     * @return 表列表
     */
    public List<DapDataModelTable> findNewestTablesByGroupPidAndGroupId(String groupPid, String groupId,
                                                            String modelId);

    /**
     * 分组和表的关系
     * 数仓类：模型id+第一层groupid+第二层
     * 非数仓类：模型id+第一层groupId
     * 获取分组下的表数据量
     *
     * @param groupPid 组1层
     * @param groupId 组2层
     * @param modelId 模型id
     * @return 表列表
     */
    public long countByGroupPidAndGroupIdAndDataNewest(String groupPid, String groupId, String modelId, boolean dataNewest);

    /**
     * 对表增加组关系
     *
     * @param tableIds 多表id
     * @param groupPid 组1
     * @param groupId 组2
     */
    public abstract void addGroupRelationToTables(List<String> tableIds, String groupPid, String groupId);

    /**
     * 分组获取当下的表数据
     * 分页
     *
     * @param currentGroup 当前组
     * @param searchVo 查询
     * @return
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    IPage<DapDataModelTable> pageDapDataModelTable(GroupTableSearchVo searchVo, DapDataModelGroup currentGroup);



    public List<TableListDto> getList(List<String> modelIds);

    /**
     * 获取模型下的最新？数据标
     * @param modelId 模型
     * @param newest 最
     * @return
     */
    int countByModelIdAndNewest(String modelId, boolean newest);

    /**
     * 获取模型下的最新？数据标
     * @param modelId 模型
     * @param newest 最
     * @return
     */
    List<DapDataModelTable> findAllByPageByModelIdAndNewest(String modelId, boolean newest);


    List<DapDataModelTable> isRepeatTableName(String name, String modelId);

    String getRenewTable(String modelId, String tableName);

    IPage<DapModelRegisterDto> getVersionRegister(SearchModelRegister register);

    ResultBean<String> tableRegister(List<String> tableIds);

    ResultBean<String> tableRegisterCancel(List<String> tableIds);

    IPage<DapDataModelTable> getShareTableList(SearchShareTableVo vo, List<String> shareTableIds);

    /**
     * 获取建表语句列表
     */
    List<String> getCreateTableSqls(ModelIds modelIds);

    /**
     * 检查表语句是否存储关键字
     */
    void checkTableCreateSql(DatabaseType databaseType, String dataModelId, String tableId) throws DapException;
}
